<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <!-- 累加数是一个字符串，组成它的数字可以形成累加序列。
    一个有效的 累加序列 必须 至少 包含 3 个数。除了最开始的两个数以外，序列中的每个后续数字必须是它之前两个数字之和。
    给你一个只包含数字 '0'-'9' 的字符串，编写一个算法来判断给定输入是否是 累加数 。如果是，返回 true ；否则，返回 false 。
    说明：累加序列里的数，除数字 0 之外，不会 以 0 开头，所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。
    示例 1：
    输入："112358"
    输出：true 
    解释：累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8
    示例 2：
    输入："199100199"
    输出：true 
    解释：累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199
    
    提示：
    1 <= num.length <= 35
    num 仅由数字（0 - 9）组成 -->

</body>
<script>
  var isAdditiveNumber = function (num) {
    // a,  b代表前两个数的长度
    function helper(a, b) {
      let num_a = Number(num.substr(0, a))
      let num_b = Number(num.substr(a, b))
      // 确保最少3个数，利用str转数字会去掉前置0判断数不能是0开头的（除0本身外）
      if (num.length <= a + b || num_a.toString() != num.substr(0, a) || num_b.toString() != num.substr(a, b)) return false
      // 循环判断是否是累加序列（字符串匹配）
      let str = num.substr(a + b)
      while (str) {
        let sum = num_a + num_b;
        if (str.substr(0, sum.toString().length) == sum.toString()) {
          [str, num_a, num_b] = [str.substr(sum.toString().length), num_b, sum]
        } else {
          return false
        }
      }
      return true
    }
    // 2个循环确定开头两个数字，开头两个数字确定了那么序列就是唯一的
    for (let i = 1; i < num.length; i += 1) {
      for (let j = 1; j < num.length; j += 1) {
        if (helper(i, j)) return true
      }
    }
    return false;
  };
</script>

</html>